#生成器，和列表生成式[]不同的是，这里用()
g = (x * x for x in range(10))

#获取下一个元素用next(g)
print(next(g))

#用for循环遍历生成器中每个元素
for i in g:
    print(i)
    
print('-----------------------')
#斐波拉契数列
#最难理解的就是generator和函数的执行流程不一样。函数是顺序执行，遇到return语句或者最后一行函数语句就返回。而变成generator的函数，在每次用
#next()的时候执行，遇到yield语句返回，再次执行时从上次返回的yield语句处继续执行。
def fib(max):
    n,a,b = 0,0,1
    while n<max:
        yield b #print(b)
        a,b = b,a+b
        n = n + 1
    return 'done'
    
print(fib(6))

g = fib(6)
#连续调用next(g)会发生StopIteration错误表示无法返回下一个值了，用try except来捕获
while True:
    try:
        x = next(g)
        print('g:',x)
    except StopIteration as e:
        print('Generator return value:',e.value)
        break
#generator，在执行过程中，遇到yield就中断，下次又继续执行。
def odd():
    print('step 1')
    yield 1  #返回1,当下次循环从这里开始，继续往下执行
    print('step 2')
    yield 3
    print('step 3')
    yield 5
    
o =odd()
for i in o:
    print(i)
